﻿using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Devonline.Entity;

namespace Devonline.Identity
{
    /// <summary>
    /// 资源密钥容器, 字符串类型的默认实现
    /// </summary>
    [Table("resource_secret"), DisplayName("资源密钥")]
    public class ResourceSecret : ResourceSecret<string>
    {
        /// <summary>
        /// 资源
        /// </summary>
        public virtual Resource Resource { get; set; }
        /// <summary>
        /// 机密
        /// </summary>
        public virtual Secret Secret { get; set; }
    }

    /// <summary>
    /// 资源密钥
    /// 加密过程: 
    /// 1. 对当前资源产生随机对称密钥, 以下简称: 资源密钥
    /// 2. 用资源密钥作为加密资源本身
    /// 3. 使用资源所有者非对称公钥加密资源密钥, 并保存到 SecretKey 字段
    /// 4. 用户非对称私钥由用户密钥加密保存
    /// 解密过程:
    /// 1. 取得用户授权, 使用用户密码解密用户私钥
    /// 2. 使用用户私钥解密资源密钥
    /// 3. 使用资源密钥解密资源本身
    /// 特权解密不同之处: 使用特权用户密码解密用户密钥
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    [Table("resource_secret"), DisplayName("资源密钥")]
    public class ResourceSecret<TKey> : EntitySetWithCreate<TKey> where TKey : IConvertible
    {
        /// <summary>
        /// 资源编号
        /// </summary>
        [Column("resource_id"), DisplayName("资源编号"), Required, MaxLength(36)]
        public virtual TKey ResourceId { get; set; }
        /// <summary>
        /// 密钥容器编号
        /// </summary>
        [Column("secret_id"), DisplayName("密钥容器编号"), Required, MaxLength(36)]
        public virtual TKey SecretId { get; set; }
        /// <summary>
        /// 当前资源加密使用的密钥密文, 对称算法密钥, 此密钥是加密资源的随机密钥, 保存为密文, 由资源所有者公钥加密, 资源所有者私钥解密
        /// </summary>
        [Column("secret_key"), DisplayName("资源密钥"), Required, MaxLength(256)]
        public virtual byte[] SecretKey { get; set; }
    }
}
